import importlib
import gradio as gr # type: ignore
import tensorflow as tf # type: ignore
from PIL import Image
import numpy as np

# 加载保存的 MLP 模型
model = tf.keras.models.load_model('best_mlp_model.keras')

# 定义预处理函数
def preprocess(image):
    image = image.resize((28, 28)).convert('L') # 将图像调整为28x28大小并转换为灰度图像
    image_array = np.array(image)
    scaled_image = image_array / 255.0 # 将像素值缩放到 [0, 1] 区间
    return scaled_image.reshape(1, 28, 28) # 返回符合模型输入形状的图像数组

# 定义预测函数,这个函数将用于 Gradio 接口进行预测
def predict(sketchpad):
    image = Image.fromarray(sketchpad.astype('uint8'), 'L') # 从 Sketchpad 数组创建图像
    preprocessed_image = preprocess(image)
    predicted_digit = np.argmax(model.predict(preprocessed_image)) # 预测图像中的数字
    return str(predicted_digit)

# 创建 Gradio 接口,这个接口将用于用户输入和显示预测结果
interface = gr.Interface(
    predict,
    gr.Sketchpad(label="请绘制数字"), # 输入画布,绘制数字
    gr.Label(label="预测结果"), # 输出预测结果
    live=True
)

# 启动 Gradio 接口,用户可以通过这个接口进行交互
interface.queue().launch(share=True)